package com.ailsa.learningsystem.service.impl;

import com.ailsa.learningsystem.dao.StuAuthority;
import com.ailsa.learningsystem.dao.TeaAuthority;
import com.ailsa.learningsystem.dao.UsersDao;
import com.ailsa.learningsystem.dao.impl.StuAuthorityImpl;
import com.ailsa.learningsystem.dao.impl.TeaAuthorityImpl;
import com.ailsa.learningsystem.dao.impl.UsersDaoImpl;
import com.ailsa.learningsystem.pojo.Course;
import com.ailsa.learningsystem.pojo.Users;
import com.ailsa.learningsystem.role.Role;
import com.ailsa.learningsystem.role.ext.StudentRole;
import com.ailsa.learningsystem.role.ext.TeacherRole;
import com.ailsa.learningsystem.service.SuperService;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @Author 冉冉
 * @Version 1.0
 */

public class SuperServiceImpl implements SuperService {
    //创建Scanner对象，直接创建对象,对象名称或者变量名称首字母小写，其他的单词首字母大写，不允许出现中文
   private Scanner input=new Scanner(System.in);
   private UsersDao usersDao=new UsersDaoImpl();
   private Role role=null;
    //类实现接口重写方法的使用快捷键：alt+insert或者fn+alt+insert

    /**
     * 系统的主菜单:
     * Scanner对象：
     * 1.如果输入int类型：使用的方法是nextInt方法
     * Java中有单个跳转语句：continue与break和return
     *  break：在java中break有个用途，第一个用途：用于终止swtich...case语句；第二个用途：终止包含break循环；
     *  第三个用途：java没有goto语句，但是扩展形式break可以用于goto位置。
     *  continue：continue将终端正常的控制流程，continue语句将控制转移到下一次的循环，不是真正结束循环
     *  return：跳出整个方法体，方法体后面部分代码不再执行。
     *
     */
    @Override
    public void mainMeun() {
        while (true){
            System.out.println("==========================欢迎进入学霸王系统2.0版本========================");
            System.out.println("1.注册  2.登录  3.退出");
            System.out.println("====================================================");
            int choice=input.nextInt();//输入int类型的数字
            switch (choice){
                case 1:
                    register();//调用注册的方法
                    continue;
                case 2:
                    accreditRole();//角色
                    continue;
                case 3:
                    System.out.println("程序退出，谢谢您的使用");
                    break;
                default:
                    System.out.println("对不起，输入有误，请重新输入");
                    continue;
            }
        }
    }
    /**
     * 注册的方法
     */
    private void register(){
        //调用获取用户的对象的方法
        Users users = getUsers();
        //调用角色类中注册方法
        usersDao.register(users);
    }
    /**
     * 获取用户的对象的方法
     */
    private Users getUsers(){
        System.out.println("请输入用户名：");
        String username = input.next();
        System.out.println("请输入密码：");
        String password = input.next();
        System.out.println("请选择用户角色：1.讲师  2.学员");
        int roleNumber = input.nextInt();
        return new Users(username,password,roleNumber);
    }

    /**
     * 初始化用户的方法
     */
    @Override
    public void initalUsers() {
        //不需要手动创建user.bat文件
        File file=new File("user.bat");
        /**
         * 判断这个文件是否存在，默认是true已存在，不存在自动创建文件
         */
        if(!file.exists()){
            List<Users> list=new ArrayList<>();
            //创建用户的对象的角色
            Role teacher=new TeacherRole();//讲师角色
            Role student=new StudentRole();//学生角色
            //定义用户对象
            Users users1=new Users("teacherZhang","zhang123",teacher);
            Users users2=new Users("zhangsan","123",student);
            //添加到集合
            list.add(users1);
            list.add(users2);
            //调用将集合存储到文件中
            saveList(list);
        }
    }
    /**
     * 初始化课程的方法
     */
    @Override
    public void initalCourse() {
        File file=new File("course.bat");
        //判断这个文件是否存在，默认是true已存在，不存在自动创建文件
        if(!file.exists()){
            List<Course> list=new ArrayList<>();
            //创建课程对象
            Course course1=new Course(1001,"初始化HTML5","前端开发",30,"30小时","teacherZhang");
            Course course2=new Course(1002,"HTML5+CSS3","前端开发",40,"40小时","teacherZhang");
            Course course3=new Course(1003,"javaSE入门","后端开发",90,"90小时","lisi");
            Course course4=new Course(1004,"MYSQL数据库","后端开发",50,"50小时","zhangsan");
        //将所有的课程添加到集合中
         list.add(course1);
         list.add(course2);
         list.add(course3);
         list.add(course4);
         //将集合添加到文件中
        saveCourse(list);
        }
    }

    /**
     * 将所有的用户信息存储到文件,涉及到了IO，需要进行序列化和反序列化,将所有的用户信息存储到user.bat
     * @param list
     * ObjectOutputStream:对象流输出流
     * FileOutputStream：字节流
     */
    private void saveList(List<Users> list){
        //声明流的对象
        ObjectOutputStream oos=null;
        //异常的快捷键：ALT+Enter【回车键】
        try{
            //使用序列化，通过字节流获取到文件内容转换为对象流
            oos=new ObjectOutputStream(new FileOutputStream("user.bat"));
            //将用户信息写入到文件
            oos.writeObject(list);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                oos.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    /**
     * 讲师菜单
     */
    private void showTeacherMenu(){
        while(true){
            System.out.println("-------------->学霸王管理系统------------>讲师模块");
            System.out.println("1.查询课程 2.根据类别查询课程 3.根据ID查询课程 4.根据名称查询课程 5.发布课程 6.根据课程名或者课程类型查询课程 7.删除课程 8.返回上一级菜单");
            System.out.println("================================================================");
            int choice=input.nextInt();
            switch (choice){
                case 1:
                    showAllCourse();//查询所有课程的方法
                    continue;
                case 2:
                    showCourseByType();//根据类别查询课程
                    continue;
                case 3:
                    showCourseById();//根据ID查询课程
                    continue;
                case 4:
                    showCourseName();//根据名称查询课程的信息
                    continue;
                case 5:
                    pub_course();//发布课程
                    continue;
                case 6:
                    showCourseByNameType();//根据课程名称或者课程类型查询课程
                    continue;
                case 7:
                    delete_course();//删除课程
                    continue;
                case 8:
                    break;
                default:
                    System.out.println("对不起，选择有误，请重新的选择");
                    continue;
            }
            break;
        }
    }
    /**
     * 学员菜单
     */
    private void showStudentMenu(){
        while(true){
            System.out.println("---------------->学霸王管理系统------------>学员模块");
            System.out.println("1.查询课程 2.根据类型查询课程 3.根据ID查询课程 4.根据课程名称查询课程 5.多条件查询课程 6.返回上一级菜单");
            System.out.println("=====================================================");
            int choice=input.nextInt();
            switch (choice){
                case 1:
                    showAllCourse();
                    continue;
                case 2:
                    showCourseByType();
                    continue;
                case 3:
                    showCourseById();
                    continue;
                case 4:
                    showCourseName();
                    continue;
                case 5:
                    showCourseByNameType();
                    continue;
                case 6:
                    break;
                default:
                    System.out.println("对不起，您选择有误，请重新选择");
                    continue;
            }
            break;
        }
    }
    /**
     * 用户的授权
     */
    private void accreditRole(){
        //获取用户的对象的方法
        Users users = getUsers();
        //登录:用户名和密码进行判断，如果想要添加角色
        boolean login = usersDao.login(users);
        if(login){
            /**
             * 登录成功之后，显示讲师菜单或者是学员菜单
             */
            if(users.getRoleNumber()==1){//讲师
                //创建讲师的角色
                role=new TeacherRole();
                TeaAuthority teaAuthority=new TeaAuthorityImpl();
                //为讲师授予讲师权限
                role.setTeaAuthority(teaAuthority);
                //为用户授予讲师角色
                users.setRole(role);
                System.out.println(users.getUsername()+"登录成功，角色："+role.getRoleName());
                showTeacherMenu();//讲师菜单
            }else{//授权学员角色
                //创建学员角色
                role=new StudentRole();
                //创建学员的权限
                StuAuthority stuAuthority=new StuAuthorityImpl();
                //为学员授权学员的权限
                role.setStuAuthority(stuAuthority);
                //为用户授予角色权限
                users.setRole(role);
                System.out.println(users.getUsername()+"登录成功，角色："+role.getRoleName());
               showStudentMenu();//显示学员菜单
            }
        }else{
            System.out.println("登录失败");
        }
    }
    /**
     * 将课程集合添加到文件中
     */
    private void saveCourse(List<Course> list){
        //声明对象流
        ObjectOutputStream oos=null;
        try{
            //创建对象流
            oos=new ObjectOutputStream(new FileOutputStream("course.bat"));
            //写对象
            oos.writeObject(list);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                oos.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    /**
     * 查询全部课程的信息
     */
    private void showAllCourse(){
        //调用显示全部的课程的方法
        List<Course> query = role.query();
        showList(query);

    }
    private void showList(List<Course> list){
        System.out.println("课程编号\t课程名称\t\t课程类别\t\t总课时\t总时长\t主讲老师");
        for (Course course:list) {
            System.out.println(course);//调用了Course默认的toString
        }
    }
    /**
     * 根据课程类别显示课程信息
     */
    private void showCourseByType(){
        System.out.println("请输入课程类别：");
        String courseType = input.next();
        //调用根据类别显示课程的信息
        List<Course> list = role.query(courseType);
        showList(list);
    }
    /**
     * 根据ID查询课程信息
     */
    private void showCourseById(){
        System.out.println("请输入课程编号");
        int courseId = input.nextInt();
        //调用角色查询的方法
        Course course = role.query(courseId);
        if(course.getCourseId()!=0){
            showList(course);
        }
    }
    private void showList(Course course){
        System.out.println("课程编号\t课程名称\t\t课程类别\t\t总课时\t总时长\t主讲老师");
        System.out.println(course);//调用了课程类中的toString方法
    }
    /**
     * 根据课程名称查询课程信息
     */
    private void showCourseName(){
        System.out.println("请输入课程名称");
        String courseName = input.next();
        //调用角色根据课程名称查询课程的信息
        List<Course> list = role.queryCorseName(courseName);
        if(list!=null && list.size()!=0){
            showList(list);
        }
    }
    /**
     * 发布课程
     */
    private void pub_course(){
        //课程名称
        System.out.println("请输入课程的名称");
        String courseName=input.next();
        System.out.println("请输入课程的类别");
        String courseType=input.next();
        System.out.println("请输入课程总课时");
        int courseCount=input.nextInt();
        System.out.println("请输入课程总时长");
        String duration=input.next();
        System.out.println("请输入主讲老师：");
        String teacher=input.next();
        /**
         *  封装成Course对象:给对象赋值两种方式
         *  1.构造方法方法进行赋值
         *  2.setter方法进行赋值
         */
        Course course=new Course();
        course.setCourseName(courseName);
        course.setCourseCount(courseCount);
        course.setCourseType(courseType);
        course.setDuration(duration);
        course.setTeacherName(teacher);
        //调用role类中发布的课程的方法
        role.pubCourse(course);
    }
    /**
     * 根据课程名称或者课程类型查询课程信息
     */
    private void showCourseByNameType(){
        System.out.println("请输入课程名称：");
        String courseName=input.next();
        System.out.println("请输入课程类型：");
        String courseType=input.next();
        List<Course> list = role.query(courseName, courseType);
        showList(list);

    }
    /**
     * 讲师删除课程
     */
    private void delete_course(){
        System.out.println("请输入要删除的课程编号：");
        int courseId = input.nextInt();
        role.deleteCourse(courseId);
    }
}
